package com.cy.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;


import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/consumer/")
public class RestConsumerController {
    @Autowired
    private RestTemplate loadBalancerRestTemplate;
    //更新操作
    @PutMapping
    public Map<String,Object> doUpdate(@RequestBody Map<String,Object> request){
        //...后续将请求数据写入到数据库
        System.out.println("consumer.map = "+request);
        //定义响应结果
        String url = String.format("http://%s/provider/", "sca-provider");
        //如下方式的更新，默认没有返回值
        //loadBalancerRestTemplate.put(url,request);
        //假如希望获取服务提供方执行更新操作时的响应结果，可以采用如下方式
        ResponseEntity<Map> responseEntity =
                loadBalancerRestTemplate.exchange(
                        url,    //请求url
                        HttpMethod.PUT, //请求方式
                        new HttpEntity<>(request),  //请求实体
                        Map.class);     //响应数据类型

        return responseEntity.getBody();    //获取响应体数据
    }

    //添加操作
    @PostMapping
    public Map<String,Object> doCreate(@RequestBody Map<String,Object> request){
        //...后续将请求数据写入到数据库
        System.out.println("consumer.map = "+request);
        //定义响应结果
        String url = String.format("http://%s/provider/", "sca-provider");
        return loadBalancerRestTemplate.postForObject(url,request,Map.class);
//        return "create ok";
    }


    @DeleteMapping("{id}")
    //直接接收可变参数会出现异常，详情如下：
//    public String doDeleteById(@PathVariable Long ...id){
    //如果以以上这种方法接收参数,传过来的是一个数组
//        System.out.println("id1 = "+id);
//        System.out.println("id1 = "+ Arrays.toString(id));
    //spring mvc在默认情况下不能直接使用接收的数组，所以后端报400异常，前端报500异常
    //400异常：为请求地址的参数异常，500异常：为服务端异常
    //解决办法一：直接以字符串类型接收
//    public String doDeleteById(@PathVariable String id){
//        String url=String.format("http://%s/provider/%s","sca-provider",id);
//        loadBalancerRestTemplate.delete(url,id);
//        return "delete ok";
//    }
    //解决办法二：将数组转为字符串进行截取
//    public String doDeleteById(@PathVariable Long ...id){
//        String idArray = Arrays.toString(id);
//        idArray = idArray.substring(1, idArray.length() - 1);
//        System.out.println("idArray = "+idArray);
//        String url=String.format("http://%s/provider/%s","sca-provider",idArray);
//        loadBalancerRestTemplate.delete(url,id);
//        return "delete ok";
//    }

    //使用loadBalancerRestTemplate中的exchange方法（如何使用没有学过的方法）
    //1、知道方法直接调用方法，所需传的参数按住Ctrl+加鼠标看源码的解释
    //2、知道需求又不会用方法的直接百度进行组合查询
    // 例如：组合查询搜索exchange的方法： RestTemplate  exchange 返回值
    //解释:exchange方法是restTemplate里面的方法

    //假如需要获取服务的提供方，执行删除操作的结果，可以通过如下方式实现
    public String doDeleteById02(@PathVariable Long id){
        String url=String.format("http://%s/provider/%s","sca-provider",id);
        ResponseEntity<String> exchange = loadBalancerRestTemplate.exchange(
                url, //请求的url
                HttpMethod.DELETE, //请求的方式
                null, //请求实体参数
                String.class //响应数据的类型
        );
        return exchange.getBody(); //响应体中的数据
    }
}
